//
// Created by aaa on 2025/7/13.
//

#include<bits/stdc++.h>

using namespace std;
const int N = 1e3 + 10;

//int n,m,s[N];
//int dp[N][N],v[N][N],w[N][N];

int n,m;
int s,w[N],v[N],dp[N];


//分组背包
//3 5
//2
//1 2
//2 4
//1
//3 4
//1
//4 5
int main(){
    cin >> n >> m;

//    for(int i = 1;i <= n;i++){
//        cin >> s[i];
//        for(int j = 1;j <= s[i];j++) cin >> w[i][j] >> v[i][j];
//    }
//
//    for(int i = 1;i <= n;i++){
//        for(int j = 1;j <= m;j++){
//            for(int k = 0;k <= s[i];k++){
//                if(j >= w[i][k]){
//                    dp[i][j] = max(dp[i][j],dp[i-1][j-w[i][k]]+v[i][k]);
//                }
//            }
//        }
//    }
//
//    cout << dp[n][m];

    for(int i = 1;i <= n;i++){
        cin >> s;
        for(int j = 1;j <= s;j++) cin >> w[j] >> v[j];

        for(int j = m;j >= 1;j--){
            for(int k = 0;k <= s;k++){
                if(j >= w[k]){
                    dp[j] = max(dp[j],dp[j-w[k]]+v[k]);
                }
            }
        }
    }

    cout << dp[m];

    return 0;
}